/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package workstationbookerweb.fragmentos;

import Fachada.Fachada;
import Servicios.ValidacionDatosEntrada;
import Singletons.Mensajes;
import VO.EstacionTrabajoVO;
import VO.ReservaEstacionVO;
import VO.ReservaSalaVO;
import VO.SalaVO;
import com.sun.rave.web.ui.appbase.AbstractFragmentBean;
import com.sun.webui.jsf.component.Button;
import com.sun.webui.jsf.component.Calendar;
import com.sun.webui.jsf.component.ImageComponent;
import com.sun.webui.jsf.component.Label;
import com.sun.webui.jsf.component.TextArea;
import com.sun.webui.jsf.component.TextField;
import java.util.ArrayList;
import java.util.Date;
import javax.faces.FacesException;
import javax.persistence.PersistenceException;
import oracle.toplink.essentials.exceptions.DatabaseException;
import workstationbookerweb.ApplicationBean1;
import workstationbookerweb.RequestBean1;
import workstationbookerweb.SessionBean1;

/**
 * <p>Fragment bean that corresponds to a similarly named JSP page
 * fragment.  This class contains component definitions (and initialization
 * code) for all components that you have defined on this fragment, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version fragmentoAdminSalas.java
 * @version Creat
 * ted on May 29, 2011, 11:06:00 AM
 * @author Jhovany Amaya
 */

public class fragmentoAdminSalas extends AbstractFragmentBean {

    private static long idSala;
    private int numeroEstaciones;
    private int estacionSeleccionada = -1;
    private Fachada fachada;
    ArrayList<EstacionTrabajoVO> listaEstaciones;
    private Button[] estaciones; // = new Button[numeroEstaciones];
    private int[] estadoEstaciones; // = new int[numeroEstaciones];
    private long[] idEstaciones; // = {1l,2l,3l,4l,5l,6l,7l,8l,9l,10l,11l,12l};
    private ReservaEstacionVO[] reservasEstacion;
    private ReservaSalaVO reservaSala = null;
    private boolean primerAcceso = true;

    private java.util.Calendar fecha = java.util.Calendar.getInstance();
    private java.util.Calendar fechaFin = java.util.Calendar.getInstance();

    private ValidacionDatosEntrada valida = new ValidacionDatosEntrada();

    //Hora máxima de préstamos en el horario establecido según día
    private int horaMax = 25;
    //Hora mínima de préstamos en el horario establecido según día
    private int horaMin = 0;

    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
        try {
            fachada = Fachada.getInstance();
        } catch (DatabaseException databaseException) {
            mensajeL.setText(databaseException.getMessage());
            return;
        }
        inicializar();
    }

    // <editor-fold defaultstate="collapsed" desc="Incialización componentes más accesores">
    private Button estacion1 = new Button();
    private Button estacion2 = new Button();
    private Button estacion3 = new Button();
    private Button estacion4 = new Button();
    private Button estacion5 = new Button();
    private Button estacion6 = new Button();
    private Button estacion7 = new Button();
    private Button estacion8 = new Button();
    private Button estacion9 = new Button();
    private Button estacion10 = new Button();
    private Button estacion11 = new Button();
    private Button estacion12 = new Button();
    private Button estacion13 = new Button();
    private Button estacion14 = new Button();
    private Button estacion15 = new Button();
    private Button estacion16 = new Button();
    private Button estacion17 = new Button();
    private Button estacion18 = new Button();
    private Button estacion19 = new Button();
    private Button estacion20 = new Button();
    private Button estacion21 = new Button();
    private Button estacion22 = new Button();
    private Button estacion23 = new Button();
    private Button estacion24 = new Button();
    private Button estacion25 = new Button();
    private Button estacion26 = new Button();
    private Button estacion27 = new Button();
    private Button estacion28 = new Button();
    private Button estacion29 = new Button();
    private Button estacion30 = new Button();
    private Button estacion31 = new Button();
    private Button estacion32 = new Button();
    private Button estacion33 = new Button();
    private Button estacion34 = new Button();
    private Button estacion35 = new Button();
    private Button estacion36 = new Button();
    private Button estacion37 = new Button();
    private Button estacion38 = new Button();
    private Button estacion39 = new Button();
    private Button estacion40 = new Button();
    private Button estacion41 = new Button();
    private Button estacion42 = new Button();
    private Button estacion43 = new Button();
    private Button estacion44 = new Button();
    private Button estacion45 = new Button();
    private Button estacion46 = new Button();
    private Button estacion47 = new Button();
    private Button estacion48 = new Button();
    private Button estacion49 = new Button();
    private Button estacion50 = new Button();

    public Button getEstacion1() {
        return estacion1;
    }
    public void setEstacion1(Button b) {
        this.estacion1 = b;
    }

    public Button getEstacion10() {
        return estacion10;
    }

    public void setEstacion10(Button estacion10) {
        this.estacion10 = estacion10;
    }

    public Button getEstacion11() {
        return estacion11;
    }

    public void setEstacion11(Button estacion11) {
        this.estacion11 = estacion11;
    }

    public Button getEstacion12() {
        return estacion12;
    }

    public void setEstacion12(Button estacion12) {
        this.estacion12 = estacion12;
    }

    public Button getEstacion13() {
        return estacion13;
    }

    public void setEstacion13(Button estacion13) {
        this.estacion13 = estacion13;
    }

    public Button getEstacion14() {
        return estacion14;
    }

    public void setEstacion14(Button estacion14) {
        this.estacion14 = estacion14;
    }

    public Button getEstacion15() {
        return estacion15;
    }

    public void setEstacion15(Button estacion15) {
        this.estacion15 = estacion15;
    }

    public Button getEstacion16() {
        return estacion16;
    }

    public void setEstacion16(Button estacion16) {
        this.estacion16 = estacion16;
    }

    public Button getEstacion17() {
        return estacion17;
    }

    public void setEstacion17(Button estacion17) {
        this.estacion17 = estacion17;
    }

    public Button getEstacion18() {
        return estacion18;
    }

    public void setEstacion18(Button estacion18) {
        this.estacion18 = estacion18;
    }

    public Button getEstacion19() {
        return estacion19;
    }

    public void setEstacion19(Button estacion19) {
        this.estacion19 = estacion19;
    }

    public Button getEstacion2() {
        return estacion2;
    }

    public void setEstacion2(Button estacion2) {
        this.estacion2 = estacion2;
    }

    public Button getEstacion20() {
        return estacion20;
    }

    public void setEstacion20(Button estacion20) {
        this.estacion20 = estacion20;
    }

    public Button getEstacion21() {
        return estacion21;
    }

    public void setEstacion21(Button estacion21) {
        this.estacion21 = estacion21;
    }

    public Button getEstacion22() {
        return estacion22;
    }

    public void setEstacion22(Button estacion22) {
        this.estacion22 = estacion22;
    }

    public Button getEstacion23() {
        return estacion23;
    }

    public void setEstacion23(Button estacion23) {
        this.estacion23 = estacion23;
    }

    public Button getEstacion24() {
        return estacion24;
    }

    public void setEstacion24(Button estacion24) {
        this.estacion24 = estacion24;
    }

    public Button getEstacion25() {
        return estacion25;
    }

    public void setEstacion25(Button estacion25) {
        this.estacion25 = estacion25;
    }

    public Button getEstacion26() {
        return estacion26;
    }

    public void setEstacion26(Button estacion26) {
        this.estacion26 = estacion26;
    }

    public Button getEstacion27() {
        return estacion27;
    }

    public void setEstacion27(Button estacion27) {
        this.estacion27 = estacion27;
    }

    public Button getEstacion28() {
        return estacion28;
    }

    public void setEstacion28(Button estacion28) {
        this.estacion28 = estacion28;
    }

    public Button getEstacion29() {
        return estacion29;
    }

    public void setEstacion29(Button estacion29) {
        this.estacion29 = estacion29;
    }

    public Button getEstacion3() {
        return estacion3;
    }

    public void setEstacion3(Button estacion3) {
        this.estacion3 = estacion3;
    }

    public Button getEstacion30() {
        return estacion30;
    }

    public void setEstacion30(Button estacion30) {
        this.estacion30 = estacion30;
    }

    public Button getEstacion31() {
        return estacion31;
    }

    public void setEstacion31(Button estacion31) {
        this.estacion31 = estacion31;
    }

    public Button getEstacion32() {
        return estacion32;
    }

    public void setEstacion32(Button estacion32) {
        this.estacion32 = estacion32;
    }

    public Button getEstacion33() {
        return estacion33;
    }

    public void setEstacion33(Button estacion33) {
        this.estacion33 = estacion33;
    }

    public Button getEstacion34() {
        return estacion34;
    }

    public void setEstacion34(Button estacion34) {
        this.estacion34 = estacion34;
    }

    public Button getEstacion35() {
        return estacion35;
    }

    public void setEstacion35(Button estacion35) {
        this.estacion35 = estacion35;
    }

    public Button getEstacion36() {
        return estacion36;
    }

    public void setEstacion36(Button estacion36) {
        this.estacion36 = estacion36;
    }

    public Button getEstacion37() {
        return estacion37;
    }

    public void setEstacion37(Button estacion37) {
        this.estacion37 = estacion37;
    }

    public Button getEstacion38() {
        return estacion38;
    }

    public void setEstacion38(Button estacion38) {
        this.estacion38 = estacion38;
    }

    public Button getEstacion39() {
        return estacion39;
    }

    public void setEstacion39(Button estacion39) {
        this.estacion39 = estacion39;
    }

    public Button getEstacion4() {
        return estacion4;
    }

    public void setEstacion4(Button estacion4) {
        this.estacion4 = estacion4;
    }

    public Button getEstacion40() {
        return estacion40;
    }

    public void setEstacion40(Button estacion40) {
        this.estacion40 = estacion40;
    }

    public Button getEstacion41() {
        return estacion41;
    }

    public void setEstacion41(Button estacion41) {
        this.estacion41 = estacion41;
    }

    public Button getEstacion42() {
        return estacion42;
    }

    public void setEstacion42(Button estacion42) {
        this.estacion42 = estacion42;
    }

    public Button getEstacion43() {
        return estacion43;
    }

    public void setEstacion43(Button estacion43) {
        this.estacion43 = estacion43;
    }

    public Button getEstacion44() {
        return estacion44;
    }

    public void setEstacion44(Button estacion44) {
        this.estacion44 = estacion44;
    }

    public Button getEstacion45() {
        return estacion45;
    }

    public void setEstacion45(Button estacion45) {
        this.estacion45 = estacion45;
    }

    public Button getEstacion46() {
        return estacion46;
    }

    public void setEstacion46(Button estacion46) {
        this.estacion46 = estacion46;
    }

    public Button getEstacion47() {
        return estacion47;
    }

    public void setEstacion47(Button estacion47) {
        this.estacion47 = estacion47;
    }

    public Button getEstacion48() {
        return estacion48;
    }

    public void setEstacion48(Button estacion48) {
        this.estacion48 = estacion48;
    }

    public Button getEstacion49() {
        return estacion49;
    }

    public void setEstacion49(Button estacion49) {
        this.estacion49 = estacion49;
    }

    public Button getEstacion5() {
        return estacion5;
    }

    public void setEstacion5(Button estacion5) {
        this.estacion5 = estacion5;
    }

    public Button getEstacion50() {
        return estacion50;
    }

    public void setEstacion50(Button estacion50) {
        this.estacion50 = estacion50;
    }

    public Button getEstacion6() {
        return estacion6;
    }

    public void setEstacion6(Button estacion6) {
        this.estacion6 = estacion6;
    }

    public Button getEstacion7() {
        return estacion7;
    }

    public void setEstacion7(Button estacion7) {
        this.estacion7 = estacion7;
    }

    public Button getEstacion8() {
        return estacion8;
    }

    public void setEstacion8(Button estacion8) {
        this.estacion8 = estacion8;
    }

    public Button getEstacion9() {
        return estacion9;
    }

    public void setEstacion9(Button estacion9) {
        this.estacion9 = estacion9;
    }

    private Label mensajeL = new Label();

    public Label getMensajeL() {
        return mensajeL;
    }

    public void setMensajeL(Label l) {
        this.mensajeL = l;
    }
    private TextArea descripcionTA = new TextArea();

    public TextArea getDescripcionTA() {
        return descripcionTA;
    }

    public void setDescripcionTA(TextArea ta) {
        this.descripcionTA = ta;
    }
    private TextField correoTF = new TextField();

    public TextField getCorreoTF() {
        return correoTF;
    }

    public void setCorreoTF(TextField tf) {
        this.correoTF = tf;
    }
    private Label nombreSalaL = new Label();

    public Label getNombreSalaL() {
        return nombreSalaL;
    }

    public void setNombreSalaL(Label l) {
        this.nombreSalaL = l;
    }
    private Button verB = new Button();

    public Button getVerB() {
        return verB;
    }

    public void setVerB(Button b) {
        this.verB = b;
    }
    private ImageComponent fondoSala = new ImageComponent();

    public ImageComponent getFondoSala() {
        return fondoSala;
    }

    public void setFondoSala(ImageComponent ic) {
        this.fondoSala = ic;
    }
    private Calendar fechaCal = new Calendar();

    public Calendar getFechaCal() {
        return fechaCal;
    }

    public void setFechaCal(Calendar c) {
        this.fechaCal = c;
    }
    private TextField horaIniTF = new TextField();

    public TextField getHoraIniTF() {
        return horaIniTF;
    }

    public void setHoraIniTF(TextField tf) {
        this.horaIniTF = tf;
    }
    private TextField horaFinTF = new TextField();

    public TextField getHoraFinTF() {
        return horaFinTF;
    }

    public void setHoraFinTF(TextField tf) {
        this.horaFinTF = tf;
    }
    private Button prestarEstacionB = new Button();

    public Button getPrestarEstacionB() {
        return prestarEstacionB;
    }

    public void setPrestarEstacionB(Button b) {
        this.prestarEstacionB = b;
    }
    private Button confirmarReservaB = new Button();

    public Button getConfirmarReservaB() {
        return confirmarReservaB;
    }

    public void setConfirmarReservaB(Button b) {
        this.confirmarReservaB = b;
    }
    private Button devolverEstacionB = new Button();

    public Button getDevolverEstacionB() {
        return devolverEstacionB;
    }

    public void setDevolverEstacionB(Button b) {
        this.devolverEstacionB = b;
    }
    private Button verReservaEstacionB = new Button();

    public Button getVerReservaEstacionB() {
        return verReservaEstacionB;
    }

    public void setVerReservaEstacionB(Button b) {
        this.verReservaEstacionB = b;
    }
    private Button actalizarEstacionB = new Button();

    public Button getActalizarEstacionB() {
        return actalizarEstacionB;
    }

    public void setActalizarEstacionB(Button b) {
        this.actalizarEstacionB = b;
    }
    private Button crearReservaSasaB = new Button();

    public Button getCrearReservaSasaB() {
        return crearReservaSasaB;
    }

    public void setCrearReservaSasaB(Button b) {
        this.crearReservaSasaB = b;
    }
    private Button confirmarReservaSalaB = new Button();

    public Button getConfirmarReservaSalaB() {
        return confirmarReservaSalaB;
    }

    public void setConfirmarReservaSalaB(Button b) {
        this.confirmarReservaSalaB = b;
    }
    private Button devolverSalaB = new Button();

    public Button getDevolverSalaB() {
        return devolverSalaB;
    }

    public void setDevolverSalaB(Button b) {
        this.devolverSalaB = b;
    }
    private Button verReservaSalaB = new Button();

    public Button getVerReservaSalaB() {
        return verReservaSalaB;
    }

    public void setVerReservaSalaB(Button b) {
        this.verReservaSalaB = b;
    }
    private Button cancelarReservaSalaB = new Button();

    public Button getCancelarReservaSalaB() {
        return cancelarReservaSalaB;
    }

    public void setCancelarReservaSalaB(Button b) {
        this.cancelarReservaSalaB = b;
    }
    private Button editarInfoB = new Button();

    public Button getEditarInfoB() {
        return editarInfoB;
    }

    public void setEditarInfoB(Button b) {
        this.editarInfoB = b;
    }
    // </editor-fold>

    // </editor-fold>

    public fragmentoAdminSalas() {
    }

    /**
     * <p>Callback method that is called whenever a page containing
     * this page fragment is navigated to, either directly via a URL,
     * or indirectly via page navigation.  Override this method to acquire
     * resources that will be needed for event handlers and lifecycle methods.</p>
     * 
     * <p>The default implementation does nothing.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
        
        
        // <editor-fold defaultstate="collapsed" desc="Visual-Web-managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("Page1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
        }
        
        // </editor-fold>
        // Perform application initialization that must complete
        // *after* managed components are initialized
        // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called.  Override this
     * method to release resources acquired in the <code>init()</code>
     * resources that will be needed for event handlers and lifecycle methods.</p>
     * 
     * <p>The default implementation does nothing.</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    private void pintar() {
        //Obtiene la lista de las estaciones de trabajo asociadas a la sala.
        listaEstaciones = fachada.listaEstacionesTrabajoPorSala(idSala);
        //Calcula el número de estaciones para futuros usos.
        numeroEstaciones = listaEstaciones.size();

        //Inicializa el arreglo de ids de estaciones, de estado de las mismas y
        //configiraciones de los botones correspondientes.
        estadoEstaciones = new int[numeroEstaciones];
        idEstaciones = new long[numeroEstaciones];
        reservaSala = fachada.verReservaSala(idSala);
        int i = 0;
        for (EstacionTrabajoVO etvo: listaEstaciones){
            if (etvo == null){
                mensajeL.setText(Mensajes.ERROR_ESTACION_TRABAJO);
                return;
            }
            if(!etvo.isDisponibilidad())
                estadoEstaciones[i]= Mensajes.FUERA_DE_SEVICIO;
            else
                estadoEstaciones[i]= Mensajes.DISPONIBLE;

            idEstaciones[i] = etvo.getId();

            estaciones[i].setToolTip(etvo.getNumero()+"");

            estaciones[i].setVisible(true);
            estaciones[i].setStyle("height: 48px; left: "+etvo.getX()+"px; top: "+etvo.getY()+"px; position: absolute; width: 48px");
            if(reservaSala==null){
                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
                    reservasEstacion[i] = fachada.verReservaEstacionTrabajo(idEstaciones[i], fecha, fechaFin);
                    if(reservasEstacion[i]==null){
                        estadoEstaciones[i]= Mensajes.DISPONIBLE;
                        if (i == estacionSeleccionada)
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_DISPONIBLE_SELECCIONADA);
                        else
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_DISPONIBLE);
                    }else if(reservasEstacion[i].getEstado()==Mensajes.RESERVADA){
                        estadoEstaciones[i]= Mensajes.RESERVADA;
                        if (i == estacionSeleccionada)
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA_SELECCIONADA);
                        else
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA);
                    }else{
                        estadoEstaciones[i]= Mensajes.OCUPADA;
                        if (i == estacionSeleccionada)
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA_SELECCIONADA);
                        else
                            estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
                    }
                }else{
                    if (i == estacionSeleccionada)
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO_SELECCIONADA);
                    else
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
                }
            }else if(reservaSala.getEstado() == Mensajes.OCUPADA){
                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
                    if (i == estacionSeleccionada)
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA_SELECCIONADA);
                    else
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
                }else{
                    if (i == estacionSeleccionada)
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO_SELECCIONADA);
                    else
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
                }
                mensajeL.setText("Sala Ocupada.");
            }else{
                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
                    if (i == estacionSeleccionada)
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA_SELECCIONADA);
                    else
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA);
                }else{
                    if (i == estacionSeleccionada)
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO_SELECCIONADA);
                    else
                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
                }
                mensajeL.setText("Sala Reservada.");
            }
            i++;
        }
        for (;i<50;i++){
            estaciones[i].setVisible(false);
        }
        estadosBotonesEstacion();

//        reservaSala = fachada.verReservaSala(idSala);
//        if(reservaSala==null){
//            for(int i = 0; i<numeroEstaciones;i++){
//                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
//                    reservasEstacion[i] = fachada.verReservaEstacionTrabajo(idEstaciones[i]);
//                    if(reservasEstacion[i]==null){
//                        estadoEstaciones[i]= Mensajes.DISPONIBLE;
//                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_DISPONIBLE);
//                    }else if(reservasEstacion[i].getEstado()==Mensajes.RESERVADA){
//                        estadoEstaciones[i]= Mensajes.RESERVADA;
//                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA);
//                    }else{
//                        estadoEstaciones[i]= Mensajes.OCUPADA;
//                        estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
//                    }
//                }else{
//                    estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
//                }
//            }
//        }else if(reservaSala.getEstado() == Mensajes.OCUPADA){
//            for(int i = 0; i<numeroEstaciones; i++){
//                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
//                    estaciones[i].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
//                }else{
//                    estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
//                }
//            }
//            mensajeL.setText("Sala Ocupada.");
//        }else{
//            for (int i = 0; i<numeroEstaciones; i++){
//                if(estadoEstaciones[i]!=Mensajes.FUERA_DE_SEVICIO){
//                    estaciones[i].setImageURL(Mensajes.URL_ESTACION_RESERVADA);
//                }else{
//                    estaciones[i].setImageURL(Mensajes.URL_ESTACION_FUERA_DE_SERVICIO);
//                }
//            }
//            mensajeL.setText("Sala Reservada.");
//        }
    }

    public String prestarEstacionB_action() {
        if(estacionSeleccionada!=-1){
            if(estadoEstaciones[estacionSeleccionada]==Mensajes.DISPONIBLE){
                String correo = (String)correoTF.getText();
                if(correo==null){
                    mensajeL.setText(Mensajes.ERROR_CAMPOS_VACIOS);
                }else if(correo.equals("")){
                    mensajeL.setText(Mensajes.ERROR_CAMPOS_VACIOS);
                }else{
                    reservasEstacion[estacionSeleccionada] = fachada.prestarEstacionTrabajoSinReserva(correo, idEstaciones[estacionSeleccionada]);
                    if(reservasEstacion[estacionSeleccionada]!=null){
                        estaciones[estacionSeleccionada].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
                        estadoEstaciones[estacionSeleccionada]=Mensajes.OCUPADA;
                        mensajeL.setText("Préstamo Exitoso.");
                    }else{
                        mensajeL.setText("No se pudo prestar la estación.");
                    }
                }
            }else{
                mensajeL.setText("Elija una estación disponible.");
            }
        }else{
            mensajeL.setText(Mensajes.ELIJA_ESTACION);
        }
        init();
        return null;
    }

    private void accionBotones(int i){
        if (estacionSeleccionada != -1){
            estaciones[estacionSeleccionada].setStyleClass("");
            estaciones[estacionSeleccionada].setImageURL(estaciones[estacionSeleccionada].getImageURL().replace("Seleccionada", ""));
        }
        estacionSeleccionada = i-1;
        estaciones[estacionSeleccionada].setStyleClass("botonEstacionSeleccionada");
        setValue("#{sessionScope.estacionSeleccionada}", new Integer(estacionSeleccionada));
        EstacionTrabajoVO etvo = listaEstaciones.get(estacionSeleccionada);

        mensajeL.setText("Estación seleccionada: No "+etvo.getNumero());

        String mensaje = "Número: "+etvo.getNumero();
        mensaje = mensaje+"\nCapacidad: "+Integer.toString(etvo.getCapacidad());
        mensaje = mensaje+"\nDisponible: "+(etvo.isDisponibilidad()?"Si":"No");
        mensaje = mensaje+"\nPC: "+(etvo.isPc()?"Si":"No");
        mensaje = mensaje+"\nToma: "+(etvo.isToma()?"Si":"No");
        mensaje = mensaje+"\nDescripción: "+etvo.getDescripcion();
        descripcionTA.setText(mensaje);

        init();
        estadosBotonesEstacion();
    }

    // <editor-fold defaultstate="collapsed" desc="Acción de los botones individuales.">
    public String estacion1_action() {
        accionBotones(1);
        return null;
    }

    public String estacion2_action() {
        accionBotones(2);
        return null;
    }

    public String estacion3_action() {
        accionBotones(3);
        return null;
    }

    public String estacion4_action() {
        accionBotones(4);
        return null;
    }

    public String estacion5_action() {
        accionBotones(5);
        return null;
    }

    public String estacion6_action() {
        accionBotones(6);
        return null;
    }

    public String estacion7_action() {
        accionBotones(7);
        return null;
    }

    public String estacion8_action() {
        accionBotones(8);
        return null;
    }

    public String estacion9_action() {
        accionBotones(9);
        return null;
    }

    public String estacion10_action() {
        accionBotones(10);
        return null;
    }

    public String estacion11_action() {
        accionBotones(11);
        return null;
    }

    public String estacion12_action() {
        accionBotones(12);
        return null;
    }

    public String estacion13_action() {
        accionBotones(13);
        return null;
    }

    public String estacion14_action() {
        accionBotones(14);
        return null;
    }

    public String estacion15_action() {
        accionBotones(15);
        return null;
    }

    public String estacion16_action() {
        accionBotones(16);
        return null;
    }

    public String estacion17_action() {
        accionBotones(17);
        return null;
    }

    public String estacion18_action() {
        accionBotones(18);
        return null;
    }

    public String estacion19_action() {
        accionBotones(19);
        return null;
    }

    public String estacion20_action() {
        accionBotones(20);
        return null;
    }

    public String estacion21_action() {
        accionBotones(21);
        return null;
    }

    public String estacion22_action() {
        accionBotones(22);
        return null;
    }

    public String estacion23_action() {
        accionBotones(23);
        return null;
    }

    public String estacion24_action() {
        accionBotones(24);
        return null;
    }

    public String estacion25_action() {
        accionBotones(25);
        return null;
    }

    public String estacion26_action() {
        accionBotones(26);
        return null;
    }

    public String estacion27_action() {
        accionBotones(27);
        return null;
    }

    public String estacion28_action() {
        accionBotones(28);
        return null;
    }

    public String estacion29_action() {
        accionBotones(29);
        return null;
    }

    public String estacion30_action() {
        accionBotones(30);
        return null;
    }

    public String estacion31_action() {
        accionBotones(31);
        return null;
    }

    public String estacion32_action() {
        accionBotones(32);
        return null;
    }

    public String estacion33_action() {
        accionBotones(33);
        return null;
    }

    public String estacion34_action() {
        accionBotones(34);
        return null;
    }

    public String estacion35_action() {
        accionBotones(35);
        return null;
    }

    public String estacion36_action() {
        accionBotones(36);
        return null;
    }

    public String estacion37_action() {
        accionBotones(37);
        return null;
    }

    public String estacion38_action() {
        accionBotones(38);
        return null;
    }

    public String estacion39_action() {
        accionBotones(39);
        return null;
    }

    public String estacion40_action() {
        accionBotones(40);
        return null;
    }

    public String estacion41_action() {
        accionBotones(41);
        return null;
    }

    public String estacion42_action() {
        accionBotones(42);
        return null;
    }

    public String estacion43_action() {
        accionBotones(43);
        return null;
    }

    public String estacion44_action() {
        accionBotones(44);
        return null;
    }

    public String estacion45_action() {
        accionBotones(45);
        return null;
    }

    public String estacion46_action() {
        accionBotones(46);
        return null;
    }

    public String estacion47_action() {
        accionBotones(47);
        return null;
    }

    public String estacion48_action() {
        accionBotones(48);
        return null;
    }

    public String estacion49_action() {
        accionBotones(49);
        return null;
    }

    public String estacion50_action() {
        accionBotones(50);
        return null;
    }
    // </editor-fold>
    
    public String confirmarReservaB_action() {
        if(estacionSeleccionada==-1){
            mensajeL.setText(Mensajes.ELIJA_ESTACION);
        }
        if(estadoEstaciones[estacionSeleccionada]==Mensajes.RESERVADA){
            reservasEstacion[estacionSeleccionada]=fachada.confirmarReservacionEquipo(reservasEstacion[estacionSeleccionada]);
            if(reservasEstacion[estacionSeleccionada]==null){
                estadoEstaciones[estacionSeleccionada]=Mensajes.DISPONIBLE;
                estaciones[estacionSeleccionada].setImageURL(Mensajes.URL_ESTACION_DISPONIBLE);
                mensajeL.setText("La reserva ha cambiado.");
            }
            if(reservasEstacion[estacionSeleccionada].getEstado()!=Mensajes.OCUPADA){
                mensajeL.setText("La reserva ha cambiado.");
            }else{
                estadoEstaciones[estacionSeleccionada]=Mensajes.OCUPADA;
                estaciones[estacionSeleccionada].setImageURL(Mensajes.URL_ESTACION_OCUPADA);
                mensajeL.setText("Reserva Confirmada.");
                init();
            }
        }
        else{
            mensajeL.setText(Mensajes.ELIJA_ESTACION_RESERVADA);
        }
        init();
        return null;
    }

    public String devolverEstacionB_action() {
        if(estacionSeleccionada!=-1){
            if(estadoEstaciones[estacionSeleccionada]==Mensajes.OCUPADA){
                boolean estado = fachada.devolverEstacionTrabajo(reservasEstacion[estacionSeleccionada]);
                if(estado){
                    estaciones[estacionSeleccionada].setImageURL(Mensajes.URL_ESTACION_DISPONIBLE);
                    reservasEstacion[estacionSeleccionada]=null;
                    mensajeL.setText("La reserva fue finalizada.");
                }else{
                    mensajeL.setText(Mensajes.ERROR_CONEXION_BD);
                }
            }else{
                mensajeL.setText("Elija una estación ocupada.");
            }
        }else{
            mensajeL.setText(Mensajes.ELIJA_ESTACION);
        }
        init();
        return null;
    }

    public String verReservaSalaB_action() {
        if(reservaSala!=null){
            String mensaje = "Horario reserva: "+reservaSala.getHorarioReserva();
            mensaje = mensaje + "\nHorario préstamo: "+reservaSala.getHorarioPrestamo();
            mensaje = mensaje + "\nAdministrador: "+reservaSala.getAdministrador();
            mensaje = mensaje + "\nProfesor: "+reservaSala.getProfesor();
            descripcionTA.setText(mensaje);
        }
        else{
            descripcionTA.setText("La sala está disponible.");
            mensajeL.setText("");
        }
        return null;
    }

    public String verReservaEstacionB_action() {
        if(estacionSeleccionada!=-1){
            if(reservasEstacion[estacionSeleccionada]!=null){
                String mensaje = "Horario reserva: "+(reservasEstacion[estacionSeleccionada].getHorarioReserva()!=null?reservasEstacion[estacionSeleccionada].getHorarioReserva():"--:-- - --:--");
                mensaje = mensaje + "\nHorario préstamo: "+reservasEstacion[estacionSeleccionada].getHorarioPrestamo();
                mensaje = mensaje + "\nEstudiante: "+reservasEstacion[estacionSeleccionada].getUsuario();
                descripcionTA.setText(mensaje);
            }
            else{
                descripcionTA.setText("La estación está disponible.");
                mensajeL.setText("");
            }
        }
        else{
            mensajeL.setText(Mensajes.ELIJA_ESTACION);
        }
        return null;
    }

    public String actalizarEstacionB_action() {
        if(estacionSeleccionada!=-1){
            setValue("#{sessionScope.idEstacion}", new Long(idEstaciones[estacionSeleccionada]));
            return "/faces/paginas/ActualizarEstacion.jsp";
        }
        else{
            mensajeL.setText(Mensajes.ELIJA_ESTACION);
            return null;
        }
    }

    public String salirB_action() {
        setValue("#{sessionScope.idSala}",null);
        setValue("#{sessionScope.idAdministrador}",null);
        return "/faces/paginas/index.jsp";
    }

    public String confirmarReservaSalaB_action() {
        if(reservaSala!=null){
            if(reservaSala.getEstado()== Mensajes.RESERVADA){
                reservaSala = fachada.confirmarReservacionSala(reservaSala);
                if(reservaSala.getEstado()== Mensajes.OCUPADA){
                    mensajeL.setText("La reserva fue confirmada con éxito.");
                    init();
                }else{
                    mensajeL.setText(Mensajes.ERROR_CONEXION_BD);
                }
                init();
            }
            else{
                mensajeL.setText("La reserva ya había sido confirmada.");
            }
        }
        else{
            mensajeL.setText(Mensajes.SALA_DISPONIBLE);
        }
        init();
        return null;
    }

    public String devolverSalaB_action() {
        if(reservaSala!=null){
            if(reservaSala.getEstado()==Mensajes.OCUPADA){
                boolean resultado = fachada.devolverSala(reservaSala.getId());
                if(resultado){
                    reservaSala=null;
                    init();
                    mensajeL.setText("La sala ha sido devuelta.");
                }
                else{
                    mensajeL.setText(Mensajes.ERROR_CONEXION_BD);
                }
            }
            else{
                mensajeL.setText(Mensajes.SALA_RESERVADA);
            }
        }
        else{
            mensajeL.setText(Mensajes.SALA_DISPONIBLE);
        }
        init();
        return null;
    }

    public String crearReservaSasaB_action() {
        return "/faces/paginas/ReservarSala.jsp";
    }

    public String verB_action() {
        init();
        if (!(reservaSala == null)){
            if (reservaSala.getEstado() == Mensajes.OCUPADA){
                confirmarReservaSalaB.setDisabled(true);
                confirmarReservaSalaB.setStyleClass("botonPanelInactivo");
                devolverSalaB.setDisabled(false);
                devolverSalaB.setStyleClass("botonPanel");
                verReservaSalaB.setDisabled(false);
                verReservaSalaB.setStyleClass("botonPanel");
            }else{
                confirmarReservaSalaB.setDisabled(false);
                confirmarReservaSalaB.setStyleClass("botonPanel");
                devolverSalaB.setDisabled(true);
                devolverSalaB.setStyleClass("botonPanelInactivo");
                verReservaSalaB.setDisabled(true);
                verReservaSalaB.setStyleClass("botonPanelInactivo");
            }
            prestarEstacionB.setDisabled(true);
            prestarEstacionB.setStyleClass("botonPanelInactivo");
            confirmarReservaB.setDisabled(true);
            confirmarReservaB.setStyleClass("botonPanelInactivo");
            devolverEstacionB.setDisabled(true);
            devolverEstacionB.setStyleClass("botonPanelInactivo");
            verReservaEstacionB.setDisabled(true);
            verReservaEstacionB.setStyleClass("botonPanelInactivo");
        }else{
            confirmarReservaSalaB.setDisabled(true);
            confirmarReservaSalaB.setStyleClass("botonPanelInactivo");
            devolverSalaB.setDisabled(true);
            devolverSalaB.setStyleClass("botonPanelInactivo");
            verReservaSalaB.setDisabled(true);
            verReservaSalaB.setStyleClass("botonPanelInactivo");
            estadosBotonesEstacion();
        }
        return null;
    }

    public void estadosBotonesEstacion(){
        if (!(estacionSeleccionada == -1)){
            if (estadoEstaciones[estacionSeleccionada] == Mensajes.DISPONIBLE){
                prestarEstacionB.setDisabled(false);
                prestarEstacionB.setStyleClass("botonPanel");
                confirmarReservaB.setDisabled(true);
                confirmarReservaB.setStyleClass("botonPanelInactivo");
                devolverEstacionB.setDisabled(true);
                devolverEstacionB.setStyleClass("botonPanelInactivo");
                verReservaEstacionB.setDisabled(true);
                verReservaEstacionB.setStyleClass("botonPanelInactivo");
                actalizarEstacionB.setDisabled(false);
                actalizarEstacionB.setStyleClass("botonPanel");
            }else if (estadoEstaciones[estacionSeleccionada] == Mensajes.RESERVADA){
                prestarEstacionB.setDisabled(true);
                prestarEstacionB.setStyleClass("botonPanelInactivo");
                confirmarReservaB.setDisabled(false);
                confirmarReservaB.setStyleClass("botonPanel");
                devolverEstacionB.setDisabled(true);
                devolverEstacionB.setStyleClass("botonPanelInactivo");
                verReservaEstacionB.setDisabled(false);
                verReservaEstacionB.setStyleClass("botonPanel");
                actalizarEstacionB.setDisabled(false);
                actalizarEstacionB.setStyleClass("botonPanel");
            }else if (estadoEstaciones[estacionSeleccionada] == Mensajes.OCUPADA){
                prestarEstacionB.setDisabled(true);
                prestarEstacionB.setStyleClass("botonPanelInactivo");
                confirmarReservaB.setDisabled(true);
                confirmarReservaB.setStyleClass("botonPanelInactivo");
                devolverEstacionB.setDisabled(false);
                devolverEstacionB.setStyleClass("botonPanel");
                verReservaEstacionB.setDisabled(false);
                verReservaEstacionB.setStyleClass("botonPanel");
                actalizarEstacionB.setDisabled(false);
                actalizarEstacionB.setStyleClass("botonPanel");
            }else{
                prestarEstacionB.setDisabled(true);
                prestarEstacionB.setStyleClass("botonPanelInactivo");
                confirmarReservaB.setDisabled(true);
                confirmarReservaB.setStyleClass("botonPanelInactivo");
                devolverEstacionB.setDisabled(true);
                devolverEstacionB.setStyleClass("botonPanelInactivo");
                verReservaEstacionB.setDisabled(true);
                verReservaEstacionB.setStyleClass("botonPanelInactivo");
                actalizarEstacionB.setDisabled(false);
                actalizarEstacionB.setStyleClass("botonPanel");
            }
        }
    }

    public String cancelarReservaSalaB_action() {
        return "/faces/paginas/CancelarReservacionSala.jsp";
    }

    public String editarInfoB_action() {
        return "/faces/paginas/EditarAdministrador.jsp";
    }

    private void inicializar() {
        mensajeL.setText("");

        Integer x = (Integer)getValue("#{sessionScope.estacionSeleccionada}");
        if (x != null)
            estacionSeleccionada = x.intValue();

        reservasEstacion = new ReservaEstacionVO[50];

        estaciones = new Button[] {estacion1, estacion2, estacion3, estacion4, estacion5,
            estacion6, estacion7, estacion8, estacion9, estacion10, estacion11, estacion12,
            estacion13, estacion14, estacion15, estacion16, estacion17, estacion18, estacion19,
            estacion20, estacion21, estacion22, estacion23, estacion24, estacion25, estacion26,
            estacion27, estacion28, estacion29, estacion30, estacion31, estacion32, estacion33,
            estacion34, estacion35, estacion36, estacion37, estacion38, estacion39, estacion40,
            estacion41, estacion42, estacion43, estacion44, estacion45, estacion46, estacion47,
            estacion48, estacion49, estacion50};

        //Obtiene el id de la sala en base a la variable de sesión.
        Long y = (Long)getValue("#{sessionScope.idSala}");
        if (y != null){
            idSala = y.longValue();
        }else{
            mensajeL.setText("No ha iniciado sesión.");
            //actualizarB.setDisabled(true);
            return;
        }
        //Obtiene el VO de la sala.
        SalaVO sala = null;
        try{
            sala = fachada.leerSala(idSala);
        }catch(PersistenceException e){
            mensajeL.setText(e.getMessage());
        }
        //Pone como título el nombre y carga la imagen de la sala.
        if (sala != null){
            nombreSalaL.setText(sala.getNombre());
            fondoSala.setUrl(sala.getUrlFondo());
        }else{
            nombreSalaL.setText("No se encontró la sala.");
            return;
        }

        //Establece la fecha
        if (primerAcceso){//Si es el primer acceso establece la fecha actual en el Calendar e inicializa combo box
            fechaCal.setSelectedDate(new Date());
            fecha.setTime(new Date());
            fechaFin.setTime(new Date());

            int diaSemana = fecha.get(java.util.Calendar.DAY_OF_WEEK);
            //Inicializa los arreglos de los combo box de las horas según el horario de la sala y la restricción por bloques de tiempo.
            if (diaSemana > java.util.Calendar.SUNDAY){ //Si es un día diferente a domingo (>1)
                if (diaSemana == java.util.Calendar.SATURDAY){//Si es un sábado (=7)
                    horaMin = Integer.parseInt(sala.getHorarioSabado().substring(0, 2));
                    horaMax = Integer.parseInt(sala.getHorarioSabado().substring(6, 8));
                    //mensajeL.setText("Sábado.");
                }else{
                    horaMin = Integer.parseInt(sala.getHorarioSemana().substring(0, 2));
                    horaMax = Integer.parseInt(sala.getHorarioSemana().substring(6, 8));
                    //mensajeL.setText("Entre semana ("+diaSemana+").");
                }
            }else{
                mensajeL.setText(Mensajes.ERROR_HORARIO_DOMINGO);
            }

            //Establece la hora actual en los campos de texto
            horaIniTF.setText(fachada.horaActual(0));
            horaFinTF.setText(fachada.horaActual(2));

        }else{//si no es el primer acceso y la fecha es válida, la obtiene y establece en fecha y fechaFin
            if (fechaCal.isValid()){
                if (horaIniTF.getText() == null || horaFinTF.getText() == null){
                    mensajeL.setText(Mensajes.ERROR_CAMPOS_VACIOS);
                    return;
                }
                if (horaIniTF.getText().toString().equals("") || horaFinTF.getText().toString().equals("")){
                    mensajeL.setText(Mensajes.ERROR_CAMPOS_VACIOS);
                    return;
                }
                String horaIni = horaIniTF.getText().toString();
                String horaFin = horaFinTF.getText().toString();
                try{
                    if (!(valida.formatoHoraCorrecto(horaIni) && valida.formatoHoraCorrecto(horaFin))){
                        mensajeL.setText(Mensajes.ERROR_FORMATO_HORA);
                        return;
                    }
                    if (!valida.horasEnOrden(horaIni, horaFin)){
                        mensajeL.setText(Mensajes.ERROR_HORAS);
                        return;
                    }
                }catch(NumberFormatException npe){
                    mensajeL.setText(Mensajes.ERROR_FORMATO_HORA);
                    return;
                }
                if (Integer.parseInt(horaIni.substring(0, 2)) < horaMin || Integer.parseInt(horaFin.substring(0, 2)) > horaMax){
                    mensajeL.setText(Mensajes.ERROR_HORARIO_ATENCION);
                    return;
                }
                fecha.setTime(fechaCal.getSelectedDate());
                fecha.set(java.util.Calendar.HOUR_OF_DAY,Integer.parseInt(horaIni.substring(0, 2)));
                fecha.set(java.util.Calendar.MINUTE,Integer.parseInt(horaIni.substring(3, 5)));
                fechaFin.setTime(fechaCal.getSelectedDate());
                fechaFin.set(java.util.Calendar.HOUR_OF_DAY,Integer.parseInt(horaFin.substring(0, 2)));
                fechaFin.set(java.util.Calendar.MINUTE,Integer.parseInt(horaFin.substring(3, 5)));
            }else{
                mensajeL.setText(Mensajes.ERROR_FECHA_SELECCIONADA);
                horaIniTF.setText("");
                horaFinTF.setText("");
                return;
            }
        }

        //Botones no seleccionables
        if (primerAcceso){
            prestarEstacionB.setDisabled(true);
            devolverEstacionB.setDisabled(true);
            confirmarReservaB.setDisabled(true);
            actalizarEstacionB.setDisabled(true);
            verReservaEstacionB.setDisabled(true);

            confirmarReservaB.setDisabled(true);
            devolverSalaB.setDisabled(true);
            verReservaSalaB.setDisabled(true);
        }

        pintar();
        primerAcceso=false;
    }

}
